#pragma once 
#include <bits/stdc++.h>

/*****************************************************************************
 *! @brief 单例模式
 * 
 * 
 * 
 * 
 *  
 ****************************************************************************/

template<typename T>
class Singleton{
public:
    template<typename... Args>
    static T* instance(Args&&... args) {
        if (_instance == nullptr) {
            _instance = new T(std::forward<Args>(args)...);
        }
        return _instance;
    }

    static void destory() {
        if (_instance != nullptr) {
            delete _instance;
            _instance = nullptr;
        }
    }

private:
    Singleton(void) = default;
    virtual ~Singleton();

    Singleton(const Singleton&)            = delete;   //! 不允许拷贝构造
    Singleton& operator=(const Singleton&) = delete;   //! 不允许赋值构造
private:
    static T*  _instance;
};

//! 非整型和枚举类型的静态成员，都需要要类外进行显式初始化
//! 这里的T* 表示的是指明_instance的类型，而不是一个返回类型
template<typename T>
T* Singleton<T>::_instance = nullptr;    

template<typename T, typename... Args>
T* getInstance(Args&&... args) {
    return Singleton<T>::instance(std::forward<Args>(args)...);
}

template<typename T>
void destory() {
    return Singleton<T>::destory();
}

int singleton();